阅读更多

1顶
0踩

企业架构

转载新闻 设计恰如其分的架构

2016-05-19 14:44 by 副主编 mengyidan1988 评论(0) 有5251人浏览
文/粱沅(简书作者)
原文链接:http://www.jianshu.com/p/ac8da825c26f

远在2009年,Martin Fowler与Rebecca Parsons在QCon SF做了一次题为Agilists and Architects: Allies not Adversaries Presentation的演讲。演讲主要讨论了在敏捷方法中的架构活动。相似的话题,Neal Ford则提出了紧急设计的概念,并发表了名为Evelutionary Architecture and Emergent Design(演进架构与紧急设计)的系列文章。这是很棒的一个讲解演进架构的系列文章,谈到了TDD、代码复用、连贯接口、DSL、重构、惯用法模式、指标等与演进架构和紧急设计有关的内容。

Neal Ford对软件架构的主要观点基于如下事实:
  • 未来是不可预测的;
  • 软件设计的最终目标是获得完整的源代码;
  • 系统的复杂度分为偶发复杂度(accidental complexity)与本质复杂度(essential complexity);

于是,我们应该选择在最后责任时刻(Last Responsible Moment)去应对系统的复杂度。所谓“最后责任时刻”,即我们如果未及时采取措施,可能导致复杂度线性增加的时刻,如下图所示:



最后责任时刻

Ford提出的方法就是在开发中善于发现抽象与模式,并借助测试驱动开发,利用重构去导向设计。同时,我们还可以尝试使用一些考量代码质量的工具,获得质量指标,通过这些指标去发现问题(这些问题其实就是技术债),然后去及时解决问题。针对较难做出的架构决策,则可以利用Spike方式快速得出结论,甚至是原型方案。

事实上,演进式架构这个话题已经是老调重弹。让我们再回到2004年,Martin Fowler当然发表了文章Is Design Dead。文中谈到了计划式设计与演进式设计之间的区别。这篇文章算得上是溯本清源。在2007年我自己的书《软件设计精要与模式》中,也简单阐述了我对二者的理解。我给出了一个建筑学的隐喻:拙政园与周庄。拙政园是计划式设计的典范,没有详尽的计划,也许就不会有疏朗典雅的拙政园。周庄却并非某人在某一时刻灵感捕捉后的设计成果,而是经历了数百年的历史沧桑,渐进地增添与更替各种建筑,最后形成现在这般灵秀的水乡风貌。我在书中写道:

引用
演进的设计,同样需要遵循架构设计的基本准则,它与计划的设计唯一的区别是设计的目标。演进的设计提倡满足客户现有的需求;而计划的设计则需要考虑未来的功能扩展。演进的设计推崇尽快地实现,追求快速确定解决方案,快速编码以及快速实现;而计划的设计则需要考虑计划的周密性,架构的完整性并保证开发过程的有条不紊。

2010年,我翻译了George Fairbanks的著作Just Enough Software Architecture。



Just Enough Software Architecture

书中除了计划式设计和演进式设计之外,还提到了第三种设计:Minimal planned design(最小计划设计),这算是一种中庸之道的选择。书中认为,演进式设计需要与一些敏捷实践配合,包括重构、测试驱动设计与持续集成。George认为计划式设计背后隐藏的思想是在构造开始之前,制订的计划可以设计出很好的细节。他还提到:

引用
当架构为并行的多个团队所共享时,计划式架构设计就具有实践意义,在子团队开始工作之前,这种计划式设计颇为有效。

书中还写道:(对于多团队开发而言)计划式架构定义了高层的组件与连接器,并与局部的设计相匹配,而子团队则设计这些组件与连接器的内部模型。架构常常会保证整体的不变量与设计决策,例如建立并发策略、连接器的标准集、分配高层职责或定义某些局部的质量属性场景。

最小计划设计,则介乎于演进式设计与计划式设计之间。支持这种设计的人认为:如果完全采取演进式设计,可能会使得设计走向死胡同;而计划式设计又非常难,因为事先对系统并没有全面的了解,可能导致设计错误。在2002年Bill Venners对Martin Fowler的采访中,Martin Fowler认为,最合理的分配是20%的计划式设计,80%的演进式设计。在George的书中,作者认为需要权衡计划式与演进式设计。一种做法是在项目初期进行计划式设计,确保架构能够处理最大的风险。之后,就可以通过局部的设计来应对需求的变化,或者采用演进式设计,通过推行重构、测试驱动设计与持续集成对架构进行演化。

博客coding the architecture上的一篇文章Just enough architecture,从方法学的角度分析如何获得恰如其分的架构。



Just Enough Architecture

文章以及上图所表达出来的含义是:传统的瀑布式采取事先设计的做法,可以认为是计划式设计;敏捷方法学倾向于演进式设计;处于其中的RUP则更像是前面提到的最小计划设计。文中主要还是关注我们在架构过程中如何做到架构的“just enough”。事实上,这一观点在George Fairbanks的著作Just enough software architecture中被反复提到,要做到这一点,就需要采用风险驱动模型(Risk-Driven Model)。RDM的架构步骤分为三步:
  • 识别风险并进行优先级排列
  • 选择并应用相关技术
  • 评估风险是否降低

其实风险驱动模型的三个步骤很容易理解,关键是我们应该如何识别风险,如何排列优先级,又该如何确定解决或控制风险的技术,并进行合理地评估,这是风险驱动模型的难点。我认为RDM带来的益处在于它给出了一个非常具有实践意义的驱动原则与方法,它告诉架构师,当我们在对系统进行架构时,需要从一开始就要重视风险,例如系统的安全性、可伸缩性、安全等诸多与质量属性有关的技术风险。

整体而言,这三种方式的设计各有优劣,我们应根据具体的场景,具体的项目,具体的团队进行针对性地分析。应该把握“因地制宜”的原则,认识到不同的项目需要不同的设计方式。对于不同的开发团队,做出的选择也会不同。例如,如果开发团队精于重构、测试驱动设计,并能很好地实施持续集成,就可以考虑采用演进式设计或最小计划设计。

我个人较倾向于Minimal planned design,至于它在演进式设计与计划式设计之前的权衡,不必完全照搬Martin Fowler给出的比例。参考DDD的分类,我将计划式设计的部分规划到战略式设计中,此时,我可以从用例出发,引入Bounded Context来寻找系统的核心领域与子领域。

通过Context Map并结合六边形架构,可以帮助我们识别Context或者说领域之间的通信方式与集成方式,从而获得整个系统的分布式架构模型。运用分层架构以及六边形架构驱动得出的Port与Adapter,可以帮助我们获得整个系统的应用逻辑架构。而Context自身,则可以作为业务逻辑架构的基础。

软件系统的质量属性算是特殊的一部分,可以借鉴质量驱动设计或风险驱动设计,来确定满足质量属性的架构方案。在这个过程中,我们可以参考常用的架构风格与架构模式。例如针对大数据处理、并发处理、资源管理、分布式架构,都有许多相应的模式与风格可供我们选择。架构风格与架构模式的选择,会直接影响到我们的系统架构。

当我们分别有了物理架构、应用逻辑架构与业务逻辑架构之后,计划式设计的过程就可以画一个句号了。由于我们有了Context作为领域边界,使得我们能够更好地划分特性团队。如DDD所述,团队之间的关系可以参考Context Map,例如Partnership、Consumer-Provider等。之后的过程就进入了DDD的战术设计层面。在这个层次,我们可以结合团队成员的能力来选择不同的设计方法。例如,可以选择DDD方法继续对子领域进行领域建模;也可以从Application层面,通过用例驱动设计,结合CRC卡和时序图进一步细化;当然,也可以通过ATDD与TDD进行测试驱动。

无论选择何种方式,我们的设计都应该把握“恰如其分”这个原则,不做不必要的“过度工程”。这或者可以看做敏捷架构的中心原则。
  • 大小: 34 KB
  • 大小: 535.9 KB
  • 大小: 145.9 KB
来自: 简书
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 恰如其分的软件架构:风险驱动的设计方法,完整扫描版

    本书描述了一种恰如其分的软件架构设计方法。作者建议根据项目面临的风险来调整架构设计的成本,并从多个视角阐述了软件架构的建模过程和方法,包括用例模型、概念模型、域模型、设计模型和代码模型等。本书不仅介绍...

  • 恰如其分的软件架构.风险驱动的设计方法

    恰如其分的软件架构》的作者在探讨比较多种架构风格的差异和利弊的基础上,结合自己的工作经验,提炼出通过风险驱动的软件架构设计方法,旨在弥补敏捷开发方法在实际工程应用中的不足。本书将理论与实践相结合,不仅...

  • 恰如其分的软件架构.风险驱动的设计方

    恰如其分的软件架构.风险驱动的设计方案 恰如其分的软件架构.风险驱动的设计方

  • 恰如其分的软件架构.pdf_恰如其分的软件架构_

    在软件架构的理解上,该文章给出较好的设计。学习软件架构的同学可以从中学习到整体设计。

  • 恰如其分的软件架构.风险驱动的设计方法.

    本书描述了一种恰如其分的架构设计方法。作者建议根据项目面临的风险来调整架构设计的成本,并从多个视角阐述了软件架构的建模过程和方法,包括用例模型、概念模型、域模型、设计模型和代码模型等。本书不仅介绍方法...

  • 恰如其分的软件架构.风险驱动的设计方法.书签目录完整版

    恰如其分的软件架构.风险驱动的设计方法.书签目录完整版 恰如其分的软件架构.风险驱动的设计方法.书签目录完整版

  • 恰如其分的软件架构

    恰如其分的软件架构风险驱动的设计方法。。。。。。。。

  • 恰如其分的软件架构.风险驱动的设计方法(带书签)

    《恰如其分的软件架构》的作者(George Fairbanks)在探讨比较多种架构风格的差异和利弊的基础上,结合自己的工作经验,提炼出通过风险驱动的软件架构设计方法,旨在弥补敏捷开发方法在实际工程应用中的不足。...

  • 第5章 运行架构设计

    答:采用“属性à场景à决策”的过程,一步一步进行架构设计。 (1)属性:就是整个系统应当遵循的质量属性。譬如,整个系统应当达到的安全性、可靠性,应当达到多少秒内的响应时间,以及多大的高

  • 读书笔记(一)《恰如其分的软件架构》

    《恰如其分的软件架构》这本书和其他英文翻译书一样,并没有太多手把手教你如何设计一个软件架构。 但是! 对于一个工作多年的嵌入式软件工程师,书中很多概念还是给人留下了深刻的印象!有一种——哦!我在做XX项目...

  • 架构设计的深入思考与总结——概述

    简单来说,软件架构设计=底层...更多阅读了《clean architecture》、《恰如其分的软件架构》书籍,更加坚定了我的想法。软件宏观架构信息只是一部分,缺失了重要的底层细节,就是毫无意义的万能架构! ---------------

  • 恰如其分的软件架构 - 读书心得

    工作整五个年头,管理工作和设计工作都做过了,下阶段主要工作在架构设计,团队技术培训方面,最近开会读几本书,如《恰如其分的软件架构》,东西比较多,摘一些重要的记在下面。 1. 行于其所不得不行,止于其所...

  • 架构设计主题阅读书目

    架构设计主题阅读书目推荐

  • 安装NumPy教程-详细版

    附件是安装NumPy教程_详细版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

  • 语音端点检测及其在Matlab中的实现.zip

    语音端点检测及其在Matlab中的实现.zip

  • C#文档打印程序Demo

    使用C#完成一般文档的打印,带有页眉,页脚文档打印,表格打印,打印预览等

  • DirectX修复工具-4-194985.zip

    directx修复工具 DirectX修复工具(DirectX repair)是系统DirectX组件修复工具,DirectX修复工具主要是用于检测当前系统的DirectX状态,若发现异常情况就可以马上进行修复,非常快捷,使用效果也非常好。

  • Python手动实现人脸识别算法

    人脸识别的主要算法 其核心算法是 欧式距离算法使用该算法计算两张脸的面部特征差异,一般在0.6 以下都可以被认为是同一张脸 人脸识别的主要步骤 1 获得人脸图片 2 将人脸图片转为128D的矩阵(这个也就是人脸特征的一种数字化表现) 3 保存人脸128D的特征到文件中 4 获取其他人脸转为128D特征通过欧式距离算法与我们保存的特征对比,如果差距在0.6以下就说明两张脸差距比较小

  • 全国大学生信息安全竞赛知识问答-CISCN 题库.zip

    ciscn 全国大学生信息安全竞赛知识问答-CISCN 题库.zip

Global site tag (gtag.js) - Google Analytics